package com.aust.proxy;

/**
 * 真实对象与代理对象实现相同的接口且必定重写相同的方法
 * 在代理对象的方法中引入相同真实对象的方法进行操作
 */
public class ProxyObject1 {
    public static void main(String[] args) {
        /**
         * 真实对象
         */
        ProxyObject1Impl proxyObject1Impl = new ProxyObject1Impl();
        /**
         * 代理对象
         */
        ProxyObject2 proxyObject2 = new ProxyObject2(proxyObject1Impl);
        proxyObject2.login("admin", "admin");
    }
}

/**
 * 真实对象与代理对象同时实现的接口
 */
interface proxyInterface1 {
    void login(String username, String password);
}

/**
 * 真实对象
 */
class ProxyObject1Impl implements proxyInterface1 {
    public void login(String username, String password) {
        System.out.println(username + " " + password);
    }
}

/**
 * 代理对象
 */
class ProxyObject2 implements proxyInterface1 {

    /**
     * 以多态形式在代理对象中引入真实对象
     */
    private proxyInterface1 proxy;

    public ProxyObject2(proxyInterface1 proxy) {
        this.proxy = proxy;
    }

    public void login(String username, String password) {
        Check();
        /**
         * 引入真实对象
         */
        proxy.login(username, password);
        Finish();
    }

    private void Finish() {
        System.out.println("登陆成功");
    }

    private void Check() {
        System.out.println("检查用户");
    }
}
